using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Drawing;
namespace Repo {
	class Gradient {
		List<KeyValuePair<float,Color>> RanArray=new List<KeyValuePair<float,Color>>();
		//public Gradient(params Color[] args) {
		//  RanArray=new Range[args.Length-1];
		//  for(int i=0;i<args.Length-1;i++)
		//    RanArray[i]=new Range((float)i/(args.Length-1),args[i],(float)(i+1)/(args.Length-1),args[i+1]);
		//}

		public void AddPoint(int i,Color c) {
			if(RanArray.Count==0&&i>0)
				RanArray.Add(new KeyValuePair<float,Color>(0,c));
			RanArray.Add(new KeyValuePair<float,Color>((float)i/100,c));

		}
		public Color Get(float percent) {
			int maxIndex=RanArray.Count-1;
			if(percent<=0)
				return Color.FromArgb(RanArray[0].Value.R,RanArray[0].Value.G,RanArray[0].Value.B);
			if(percent>=RanArray[maxIndex].Key)
				return Color.FromArgb(RanArray[maxIndex].Value.R,RanArray[maxIndex].Value.G,RanArray[maxIndex].Value.B);

			for(int i=0;i<RanArray.Count-1;i++)
				if(percent>=RanArray[i].Key&&percent<=RanArray[i+1].Key)
				{
					int r=(int)((RanArray[i+1].Value.R-RanArray[i].Value.R)/(RanArray[i+1].Key-RanArray[i].Key)*(percent-RanArray[i].Key)+RanArray[i].Value.R);
					int g=(int)((RanArray[i+1].Value.G-RanArray[i].Value.G)/(RanArray[i+1].Key-RanArray[i].Key)*(percent-RanArray[i].Key)+RanArray[i].Value.G);
					int b=(int)((RanArray[i+1].Value.B-RanArray[i].Value.B)/(RanArray[i+1].Key-RanArray[i].Key)*(percent-RanArray[i].Key)+RanArray[i].Value.B);
					return Color.FromArgb(r,g,b);
					//$r=round(($grad[$keys[$i+1]][0]-$grad[$keys[$i]][0])/($keys[$i+1]-$keys[$i])*($q-$keys[$i])+$grad[$keys[$i]][0]);
				}

			//    return ran.GetColor(percent);
			throw new Exception();
		}
		//class Range {
		//  //public Range(float m1,Color c1,float m2,Color c2) {
		//  //  minLimit=m1;
		//  //  maxLimit=m2;
		//  //  minCol=c1;
		//  //  maxCol=c2;
		//  //}
		//  //public Range(int i,Color c) {
		//  //  minLimit=m1;
		//  //  maxLimit=m2;
		//  //  minCol=c1;
		//  //  maxCol=c2;
		//  //}
		//  public bool InRange(float f) {
		//    return minLimit<=f&&f<=maxLimit;
		//  }
		//  int limit;
		//  //float maxLimit;
		//  Color col;
		//  //Color maxCol;
		//  public Color GetColor(float percent) {
		//    float fraction=(percent-minLimit)/(maxLimit-minLimit);
		//    return Interpolate(maxCol,minCol,fraction);
		//  }
		//  Color Interpolate(Color color1,Color color2,float fraction) {
		//    float r=Interpolate(color1.R,color2.R,fraction);
		//    float g=Interpolate(color1.G,color2.G,fraction);
		//    float b=Interpolate(color1.B,color2.B,fraction);
		//    return Color.FromArgb((int)r,(int)g,(int)b);
		//  }
		//  float Interpolate(float d1,float d2,float fraction) {
		//    return d2+(d1-d2)*fraction;
		//  }
		//}
	}
	public class Helper {
		public static GridView Table(DataTable tab) {
			GridView gw=new GridView();
			gw.CssClass="sortable";
			gw.DataSource=tab;
			gw.DataBind();
			return gw;
		}
		static string ColValue(object col) {
			if(col is DBNull)
				return "[NULL]";
			else if(col is string)
			{
				string strcol=(col as string).Trim();//.ToUpper();
				if(strcol=="")
					return "[EMPTY]";
				return strcol;
			}
			else
				return col.ToString().Trim();
		}
		public static int IntCompare(string str1,string str2) {
			int int1,int2;
			if(int.TryParse(str1,out int1)&&int.TryParse(str2,out int2))
				return int1.CompareTo(int2);
			return 0;
		}
		public static DataTable Transform(DataTable table,int sortX) {
			DataTable ret=new DataTable();
			int cols=table.Columns.Count;
			string[] colsY=new string[cols-2];
			for(int i=0;i<cols-2;i++)
				colsY[i]=table.Columns[i].ToString();
			string columnX=table.Columns[cols-2].ToString();
			//System.Diagnostics.Debug.Assert(table.Columns[cols-1].DataType==typeof(int));
			string columnZ=table.Columns[cols-1].ToString();
			for(int i=0;i<cols-2;i++)
				ret.Columns.Add(colsY[i]);
			List<string> columnXValues=new List<string>();
			foreach(DataRow dr in table.Rows)
			{
				string colX=ColValue(dr[columnX]);
				if(!columnXValues.Contains(colX))
					columnXValues.Add(colX);
			}
			if(sortX==1)//string sort
				columnXValues.Sort();
			else if(sortX==2)//int sort
				columnXValues.Sort(IntCompare);

			foreach(string str in columnXValues)
				ret.Columns.Add(str);
			Dictionary<string,DataRow> rows=new Dictionary<string,DataRow>();
			foreach(DataRow dr in table.Rows)
			{
				string keyY="";
				for(int i=0;i<cols-2;i++)
					keyY+=ColValue(dr[colsY[i]])+"-";//TODO:are null and empty the same without ColValue?
				string keyX=ColValue(dr[columnX]);
				if(!rows.ContainsKey(keyY))
				{
					DataRow row=ret.NewRow();
					for(int i=0;i<cols-2;i++)
						row[colsY[i]]=ColValue(dr[colsY[i]]);
					rows.Add(keyY,row);
					ret.Rows.Add(row);
				}
				rows[keyY][keyX]=dr[columnZ].ToString();
			}
			return ret;
		}
	}


}
